#include <SPI.h>

// 定义闪存芯片引脚
const int chipSelectPin = 10; // 闪存芯片的片选引脚

void setup() {
  Serial.begin(9600);

  // 初始化 SPI
  SPI.begin();
  SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));

  // 设置闪存芯片的片选引脚为输出模式
  pinMode(chipSelectPin, OUTPUT);
  digitalWrite(chipSelectPin, HIGH); // 禁用闪存芯片
}

void loop() {
  // 读取闪存芯片的数据
  readFlashMemory();

  // 写入数据到闪存芯片
  writeFlashMemory();

  delay(1000);
}

void readFlashMemory() {
  digitalWrite(chipSelectPin, LOW); // 使能闪存芯片

  // 发送读取指令和地址
  SPI.transfer(0x03); // 读取指令
  SPI.transfer16(0x0000); // 读取地址，这里假设要读取的地址为 0x0000

  // 读取数据
  for (int i = 0; i < 256; i++) {
    byte data = SPI.transfer(0x00);
    Serial.print(data, HEX);
    Serial.print(" ");
  }
  Serial.println();

  digitalWrite(chipSelectPin, HIGH); // 禁用闪存芯片
}

void writeFlashMemory() {
  digitalWrite(chipSelectPin, LOW); // 使能闪存芯片

  // 发送写使能指令
  SPI.transfer(0x06); // 写使能指令

  // 发送写入指令和地址
  SPI.transfer(0x02); // 写入指令
  SPI.transfer16(0x0000); // 写入地址，这里假设要写入的地址为 0x0000

  // 写入数据
  for (int i = 0; i < 256; i++) {
    SPI.transfer(i); // 写入数据，这里假设要写入的数据为 0x00 到 0xFF 递增
  }

  digitalWrite(chipSelectPin, HIGH); // 禁用闪存芯片

  delay(10); // 等待写入完成
}